/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.supinfo.youfood.web.servlet.admin.produit;

import com.supinfo.youfood.entity.CategorieProduit;
import com.supinfo.youfood.entity.Employe;
import com.supinfo.youfood.entity.Produit;
import com.supinfo.youfood.entity.Restaurant;
import com.supinfo.youfood.service.CategorieProduitService;
import com.supinfo.youfood.service.ProduitService;
import com.supinfo.youfood.service.RestaurantService;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author TaKeO
 */
@WebServlet(name = "AddProduitServlet", urlPatterns = {"/admin/ajouter-produit"})
public class AddProduitServlet extends HttpServlet {

    @EJB
    private CategorieProduitService categorieproduitService;
        
    @EJB
    private ProduitService produitService;
    
    @EJB 
    private RestaurantService restoService;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        if(request.getParameter("id") != null)
        {
            Produit produit = produitService.findProduitById(new Long(request.getParameter("id")));
            request.setAttribute("produit", produit);
        }        
        
        List<CategorieProduit> categories = categorieproduitService.getAllCategorieProduit();
        System.out.println(categories.get(0).getNom());
        request.setAttribute("categories", categories);
        
        request.getRequestDispatcher("/jsp/admin/ajouter-produit.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Produit produit;
        if(request.getParameter("id") != null)
        {
            produit = produitService.findProduitById(new Long(request.getParameter("id")));
        }
        else
        {
            produit = new Produit();  
        }
        
        produit.setLibelle(request.getParameter("libelle"));
        try
        {
            produit.setPrixHT(new Double(request.getParameter("prix")));
        }
        catch(Exception e){ /*erreur*/ }
        
        CategorieProduit category = categorieproduitService.findCategorieProduitById(new Long(request.getParameter("type")));
        produit.setCategorie(category);
        
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Set<ConstraintViolation<Produit>> constraintViolations = validator.validate(produit);

        if (constraintViolations.size() > 0) 
        {
            List<String> errors = new ArrayList<String>();
            
            for (ConstraintViolation<Produit> contraintes : constraintViolations) 
            {
                errors.add(contraintes.getPropertyPath()+" "+contraintes.getMessage());
            }
            
            request.setAttribute("errors", errors);
            getServletContext().getRequestDispatcher("/jsp/admin/ajouter-produit.jsp").forward(request, response);
        }
        else
        {
            Employe employe = (Employe) request.getSession().getAttribute("currentEmp");
            if(employe.getType_employe().getDroits() < 700)
            {
                produit.addRestaurant(employe.getResto());
            }
            else
            {
                List<Restaurant> restos = restoService.getAllResto();
                produit.setDansRestaurants(restos);
            }
            produit.setActif(1);
            
            if(request.getParameter("id") != null)
            {
                produit.setId(null);
                produit = produitService.addProduit(produit);
            }
            else
            {
                produit = produitService.addProduit(produit);
            } 
            try {
                this.uploadImage(request, response, produit);
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
            
            if(employe.getType_employe().getDroits() < 700)
            {
                Restaurant resto = employe.getResto();
                resto.addProduit(produit);
                restoService.refreshResto(resto);
            }
            else
            {
                List<Restaurant> restos = restoService.getAllResto();
                for(int i=0; i<restos.size(); i++)
                {
                    restos.get(i).addProduit(produit);
                    restoService.refreshResto(restos.get(i));
                }
            }
            
            
            
            category.addProduit(produit);
            categorieproduitService.refreshCategorieProduit(category);

            response.sendRedirect("/YouFood/admin/liste-produits");
        }
    }

    protected boolean uploadImage(HttpServletRequest request, HttpServletResponse response, Produit produit) throws ServletException, Exception {
        boolean success = true;
        String temporaryPath = "D:/SUPINFO/Projets/YooFood_Start/YouFood/web/img/produits";
        String destinationPath = temporaryPath+"/"+produit.getId_produit()+".jpg";
        
        File tmpDir = new File(destinationPath);
        
        DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
        fileItemFactory.setSizeThreshold(1*1024*1024); //1 MB
        fileItemFactory.setRepository(tmpDir);
        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        
        try {
            List items = uploadHandler.parseRequest(request);
            Iterator itr = items.iterator();
            while(itr.hasNext()) {
                FileItem item = (FileItem) itr.next();
                File fil = new File(tmpDir,item.getName());
                item.write(fil);
                int mid= item.getName().lastIndexOf(".");
                
                String nomImage = produit.getId_produit()+"."+item.getName().substring(mid+1, item.getName().length());
                fil.renameTo(new File(nomImage));
            }
        }
        catch(FileUploadException ex) {
                log("Error encountered while parsing the request",ex);
                success = false;
        } catch(Exception ex) {
                log("Error encountered while uploading file",ex);
                success = false;
        }
        return success;
    }
}
